상태와 StreamableHTTP 전송

Anthropic
Claude에서 열기
이 강좌에 대해 질문하기
노트 복사
LLM용 전체 강좌 노트 복사

MCP 서버의 stateless_httpjson_response 플래그는 서버 동작의 근본적인 측면을 제어합니다. 특히 서버를 확장하거나 프로덕션에 배포할 계획이라면, 이들을 언제 왜 사용하는지 이해하는 것이 중요합니다.

Stateless HTTP가 필요한 경우

인기 있는 MCP 서버를 구축한다고 상상해 보세요. 처음에는 단일 서버 인스턴스에 몇 개의 클라이언트만 연결될 수 있습니다:

서버가 성장하면 수천 개의 클라이언트가 연결을 시도할 수 있습니다. 단일 서버 인스턴스로는 모든 트래픽을 처리할 수 없습니다:

일반적인 해결책은 수평 확장입니다 - 로드 밸런서 뒤에 여러 서버 인스턴스를 실행하는 것입니다:

하지만 여기서 상황이 복잡해집니다. MCP 클라이언트에는 두 개의 별도 연결이 필요하다는 것을 기억하세요:

  • 서버에서 클라이언트로의 요청을 수신하기 위한 GET SSE 연결
  • 도구 호출 및 응답 수신을 위한 POST 요청

로드 밸런서를 사용하면 이러한 요청이 다른 서버 인스턴스로 라우팅될 수 있습니다. 도구가 Claude를 사용해야 하는 경우(샘플링을 통해), POST 요청을 처리하는 서버는 GET SSE 연결을 처리하는 서버와 조정해야 합니다. 이는 서버 간 복잡한 조정 문제를 만듭니다.

Stateless HTTP가 이를 해결하는 방법

stateless_http=True를 설정하면 이 조정 문제가 해결되지만, 상당한 절충안이 따릅니다:

stateless HTTP가 활성화되면:

  • 클라이언트가 세션 ID를 받지 못함 - 서버가 개별 클라이언트를 추적할 수 없습니다
  • 서버에서 클라이언트로의 요청 불가 - GET SSE 경로를 사용할 수 없게 됩니다
  • 샘플링 불가 - Claude나 다른 AI 모델을 사용할 수 없습니다
  • 진행 보고 불가 - 장시간 작업 중 진행 업데이트를 보낼 수 없습니다
  • 구독 불가 - 리소스 업데이트에 대해 클라이언트에 알림을 보낼 수 없습니다

그러나 한 가지 이점이 있습니다: 클라이언트 초기화가 더 이상 필요하지 않습니다. 클라이언트는 초기 핸드셰이크 과정 없이 직접 요청할 수 있습니다.

JSON Response 이해하기

json_response=True 플래그는 더 간단합니다 - POST 요청 응답의 스트리밍을 비활성화합니다. 도구가 실행되는 동안 여러 SSE 메시지를 받는 대신 최종 결과만 일반 JSON으로 받습니다.

스트리밍이 비활성화되면:

  • 중간 진행 메시지 없음
  • 실행 중 로그 문 없음
  • 최종 도구 결과만 제공

이 플래그를 사용해야 할 때

stateless HTTP를 사용해야 할 때:

  • 로드 밸런서를 사용한 수평 확장이 필요할 때
  • 서버에서 클라이언트로의 통신이 필요하지 않을 때
  • 도구에 AI 모델 샘플링이 필요하지 않을 때
  • 연결 오버헤드를 최소화하고 싶을 때

JSON response를 사용해야 할 때:

  • 스트리밍 응답이 필요하지 않을 때
  • 더 간단한 비스트리밍 HTTP 응답을 선호할 때
  • 일반 JSON을 기대하는 시스템과 통합할 때

개발 vs 프로덕션

로컬에서 표준 I/O 전송으로 개발하지만 HTTP 전송으로 배포할 계획이라면, 프로덕션에서 사용할 동일한 전송으로 테스트하세요. stateful과 stateless 모드 간의 동작 차이가 상당할 수 있으며, 프로덕션보다 개발 중에 문제를 발견하는 것이 낫습니다.

이 플래그들은 MCP 서버의 작동 방식을 근본적으로 변경하므로, 특정 확장성 및 기능 요구 사항에 따라 선택하세요.